Análise do Jogo de Imagens aplicadas no Ensino médio

Amostra dos dados da pesquisa realizada

Tabulação do número de acertos dos itens do jogo de imagens.

Coluna Descrição
Exoticas Número de acertos dentre todas as imagens exibidas do tipo exótica, valor experado é 5.
Nativas Número de acertos dentre todas as imagens exibidas do tipo nativa, valor experado é 5.
head(pos_gabarito$dados, 10)

Determinado a taxa de percepção

Entende-se por taxa de percepção o fator determinado pela quantidade média de acertos dentre as questões apresentadas aos alunos, em relação a turma em que o questionario foi aplicado.

Percepção dos alunos

print(pos_gabarito$percentual_acerto)

Entendendo a distribuição das médias

Níveis de reconhecimento (acertos) por tipo de origem dos animais

grid.arrange(
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_nome_exoticas,
                  pos_gabarito$percentual_acerto$p_nome_nativas,
                  "Identificação dos nomes"),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_origem_exoticas,
                  pos_gabarito$percentual_acerto$p_origem_nativas,
                  "Identificação das origens", y = ""),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_indice_exoticas,
                  pos_gabarito$percentual_acerto$p_indice_nativas,
                  "Taxa de reconhecimento", y = ""), 
    ncol = 3,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

Diferença de acertos

grid.arrange(
    ggplot(pos_gabarito$dados, aes(exoticas - nativas)) +
        geom_histogram(bins = 10) +
        scale_y_continuous(limits = c(0,130)) +
        scale_x_continuous(limits = c(-5,5)) +
        labs(title = "Identificação dos nomes", y = "Total de acertos") +
        my_theme,
    ggplot(pos_gabarito$dados, aes(origem_exoticas - origem_nativas)) +
        geom_histogram(bins = 10) +
        #geom_density(fill = "red") +
        scale_y_continuous(limits = c(0,130)) +
        scale_x_continuous(limits = c(-5,5)) +
        labs(title = "Identificação das origens", y = "") +
        my_theme,
    ggplot(pos_gabarito$dados, aes(indice_exoticas - indice_nativas)) +
        geom_histogram(bins = 10, fill = "darkblue") +
        scale_y_continuous(limits = c(0,130)) +
        scale_x_continuous(limits = c(-5,5)) +
        labs(title = "Taxa de reconhecimento", y = "") +
        my_theme, 
    ggtexttable(normalidade(pos_gabarito$dados$exoticas - pos_gabarito$dados$nativas),
                rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 9)),
    ggtexttable(normalidade(pos_gabarito$dados$origem_exoticas - pos_gabarito$dados$origem_nativas),
                rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 9)),
    ggtexttable(normalidade(pos_gabarito$dados$indice_exoticas - pos_gabarito$dados$indice_nativas),
                rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 9)),
    ncol = 3,
    top = textGrob("Histograma das diferenças Exoticas x Nativas\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    heights=c(3/4, 1/4),
    right = "\n",
    bottom = "\n"
)

Grupos taxonómicos

rbind(
    cbind(grupo = "Aves", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_aves))),
    cbind(grupo = "Aves", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_aves))),
    cbind(grupo = "Invertebrados", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_invertebrado))),
    cbind(grupo = "Invertebrados", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_invertebrado))),
    cbind(grupo = "Mamiferos", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_mamifero))),
    cbind(grupo = "Mamiferos", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_mamifero))),
    cbind(grupo = "Peixes", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_peixe))),
    cbind(grupo = "Peixes", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_peixe))),
    cbind(grupo = "Répteis", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_reptil))),
    cbind(grupo = "Répteis", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_reptil)))
) %>%
        ggplot(aes(x=Var1, y = Freq, fill = origem)) + 
        geom_bar(stat="identity", width=.5, position = "dodge") +
        facet_wrap(~grupo, scales = "free") + 
        labs(title = "Percentual de acerto x grupos taxonomicos\n", 
             y = "Frequencia", x = "Percentual de acerto") +
        my_theme

grid.arrange(
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_aves,
                  pos_gabarito$percentual_acerto$p_nativa_aves,
                  "Aves", "Média percentual de acertos\n",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_invertebrado,
                  pos_gabarito$percentual_acerto$p_nativa_invertebrado,
                  "Invertebrados", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_mamifero,
                  pos_gabarito$percentual_acerto$p_nativa_mamifero,
                  "Mamiferos", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_peixe,
                  pos_gabarito$percentual_acerto$p_nativa_peixe,
                  "Peixes", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_reptil,
                  pos_gabarito$percentual_acerto$p_nativa_reptil,
                  "Répteis", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    ncol = 5,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

cidade1 <- pos_gabarito$percentual_acerto[pos_gabarito$percentual_acerto$municipio == "Silvânia",]
cidade2 <- pos_gabarito$percentual_acerto[pos_gabarito$percentual_acerto$municipio == "Bela Vista de Goiás",]
grid.arrange(
    plotAnaliseMedias(
        cidade1$p_indice_exoticas,
        cidade1$p_indice_nativas,
        "Silvânia"),
    plotAnaliseMedias(
        cidade2$p_indice_exoticas,
        cidade2$p_indice_nativas,
        "Bela Vista de Goiás", ytext = ""),
    ncol = 2,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

Medindo as médias de acerto na identificação do nome das espécies

# pos_gabarito$percentual_acerto %>%
#     group_by(municipio) %>%
#     summarise(exoticas = mean(p_indice_exoticas),
#               nativas = mean(p_indice_nativas)) %>%
#     ungroup() %>%
#     melt(id = "municipio") %>%
#     ggplot(aes(municipio, value, fill = variable)) +
#     facet_wrap(~variable)+
#     geom_point(show.legend = F) +
#     geom_errorbar(aes(ymin = ic.media(variable)$error_inferior, ymax = ic.media(variable)$error_superior )) +
#     labs(title = "Média de taxa de reconhecimento das origens exóticas por municipio\n",
#          x = "", y = "Percentual médio de acerto\n") +
#     my_theme
barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$municipio,
    mean), main = "Média de taxa de reconhecimento das origens exóticas por areas")

barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$area,
    mean), main = "Média de taxa de reconhecimento das origens exóticas por areas")

barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    pos_gabarito$percentual_acerto$area,
    mean), main = "Média de taxa de reconhecimento das origens exóticas por areas")

barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$turmas,
    mean), main = "Média de taxa de reconhecimento das origens exóticas por turmas")

barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    pos_gabarito$percentual_acerto$turmas,
    mean), main = "Média de taxa de reconhecimento das origens nativas por turmas")

Teste de normalidade

Para determinar a normalidade nas distribuiçoes das respostas do jogo de imagens.

Identificação médio das turmas (nomes das espécies & origens)

grid.arrange(t1$plot, t2$plot,
             t1$normalidade, t2$normalidade,
             t3$plot, t4$plot,
             t3$normalidade, t4$normalidade,
             ncol = 2,
             heights = c(3,2,3,2),
             top = textGrob("Densidade de identificação média das turmas entre \nespecies e suas origens\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Indice de reconhecimento médio das turmas

grid.arrange(t5$plot, t6$plot,
             t5$normalidade, t6$normalidade,
             ncol = 2,
             heights = c(4,3),
             top = textGrob("Densidade dos indices de reconhecimento médio das turmas\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Q-Q Test

qqplot.data <- function (vec, titulo) {
  # following four lines from base R's qqline()
  y <- quantile(vec[!is.na(vec)], c(0.25, 0.75))
  x <- qnorm(c(0.25, 0.75))
  slope <- diff(y)/diff(x)
  int <- y[1L] - slope * x[1L]
  d <- data.frame(resids = vec)
  ggplot(d, aes(sample = resids)) + 
      stat_qq() + 
      geom_abline(slope = slope, intercept = int, col = "red") +
      xlim(-2, 2) +
      ylim(0, 1) +
      theme_bw() +
      labs(
        title = titulo
    )
}
q1 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_nativas, "Identificação do nome das espécies de origem Nativas")
q2 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_exoticas, "Identificação do nome das espécies de origem Exoticas")
q3 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_origem_nativas, "Identificação de origem Nativas")
q4 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_origem_exoticas, "Identificação de origem Exoticas")
q5 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_indice_nativas, "Indice de reconhecimento Nativas (origens + espécies)")
q6 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_indice_exoticas, "Indice de reconhecimento Exoticas (origens + espécies)")
grid.arrange(q1, q2, 
             q3, q4,
             q5, q6,
             ncol = 2,
             top = textGrob("Normal Q-Q Plot\n", 
                            gp = gpar(fontsize = 20, font = 2))
             )

Teste de variância

Para determinar a variância

variancia <- data.frame(
    Algoritmo = c("F test to compare two variances"),
    "Comparação" = c("Nativas x Exóticas"),
    "Variável" = c(
        "Indice de reconhecimento",
        "Identificação do nome das espécies",
        "Identificação da origem"
    ),
    "p_valor" = c(
        var.test(pos_gabarito$proporcoes$por_turma$p_indice_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_indice_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
                 alternative = "two.sided")$p.value
    )
)
variancia <- variancia %>%
    mutate(
        variancia = p_valor > 0.05,
        p_valor = cell_spec(round(p_valor, 4), bold = T, color = "black", align = "right"),
        variancia = cell_spec(variancia, bold = variancia,
                       color= ifelse(variancia, "white", "black"), 
                       background = ifelse(variancia, "green", "#CCCCCC"))
    )
variancia %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") 
Algoritmo Comparação Variável p_valor variancia
F test to compare two variances Nativas x Exóticas Indice de reconhecimento 0.2969 TRUE
Identificação do nome das espécies 0.7332 TRUE
Identificação da origem 0.0343 FALSE

Analises descritivas

head(pos_gabarito$especies, 10)

Indice de identificação por Origem

pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = grupo)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.5) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~origem, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Indice de Identificação por Origem",
         fill = "Grupos", x = "", y = "\nFrequencia relativa") +
    my_theme

Indice de identificação por Espécie

pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = origem)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.3) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~grupo, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Indice de Identificação por Espécie",
         fill = "Origem", x = "", y = "\nFrequencia relativa") +
    my_theme

Testes de hipoteses

Esperado p-valor >= 0.05 na normalidade (espera-se H0) Esperado p-valor <= 0.05 no teste de hipotese (espera-se H1)

Tabela dos testes de hipoteses aplicados

t1 <- t.test(
   pos_gabarito$percentual_acerto$p_nome_exoticas, 
   pos_gabarito$percentual_acerto$p_nome_nativas, 
   alternative = "two.sided", paired = TRUE, conf.level = .95)
t2 <- t.test(
   pos_gabarito$percentual_acerto$p_origem_exoticas, 
   pos_gabarito$percentual_acerto$p_origem_nativas, 
   alternative = "two.sided", paired = TRUE, conf.level = .95)
t3 <- t.test(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    alternative = "two.sided", paired = TRUE, conf.level = .95)
t1b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_nome_exoticas, 
    pos_gabarito$percentual_acerto$p_nome_nativas, 
    alternative = "two.sided", paired = TRUE)
t2b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_origem_exoticas, 
    pos_gabarito$percentual_acerto$p_origem_nativas, 
    alternative = "two.sided", paired = TRUE)
t3b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    alternative = "two.sided", paired = TRUE)
data.frame(
    "Comparação" = c("Exóticas x Nativas"),
    Algoritmo = c(t1$method, t2$method, t3$method, t1b$method, t2b$method, t3b$method),
    "Variável" = c(
        "Identificação do nome das espécies",
        "Identificação da origem",
        "Indice de reconhecimento"
    ),
    p_valor = c(t1$p.value, t2$p.value, t3$p.value, 
                t1b$p.value, t2b$p.value, t3b$p.value),
    H0 = c(t1$p.value >= 0.05, t2$p.value >= 0.05, t3$p.value >= 0.05, 
           t1b$p.value >= 0.05, t2b$p.value >= 0.05, t3b$p.value >= 0.05),
    H1 = c(t1$p.value < 0.05, t2$p.value < 0.05, t3$p.value < 0.05,
           t1b$p.value < 0.05, t2b$p.value < 0.05, t3b$p.value < 0.05),
    "Confiança" = c(
        paste(paste0(round(t1$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t2$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t3$conf.int * 100, 2), "%"), collapse = " ~ "),
        "-",
        "-",
        "-"
    )
) %>%
  mutate(
    p_valor = cell_spec(p_valor, bold = T, color = "black", align = "right"),
    H0 = cell_spec(H0, bold = H0,
                   color= ifelse(H0, "white", "black"), 
                   background = ifelse(H0, "green", "#CCCCCC")),
    H1 = cell_spec(H1, bold = H1, 
                   color = ifelse(H1, "white", "black"), 
                   background = ifelse(H1, "green", "#CCCCCC"))
  ) %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(2, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") %>%
  footnote(general = "Intervalo de confiança 95%",
           general_title = "\nObs.: ",
           footnote_as_chunk = T)
Comparação Algoritmo Variável p_valor H0 H1 Confiança
Exóticas x Nativas Paired t-test Identificação do nome das espécies 3.04980558564671e-88 FALSE TRUE 33.88% ~ 39.25%
Identificação da origem 9.53291446070658e-46 FALSE TRUE -31.12% ~ -24.46%
Indice de reconhecimento 2.42750761381397e-13 FALSE TRUE 8.53% ~ 14.47%
Wilcoxon signed rank test with continuity correction Identificação do nome das espécies 9.13901290530953e-52 FALSE TRUE -
Identificação da origem 1.34804992730944e-34 FALSE TRUE -
Indice de reconhecimento 4.73943028972212e-12 FALSE TRUE -

Obs.:
Intervalo de confiança 95%

1 - Os alunos itendificam mais os nomes dos animais de espécies exóticas que os animais de espécies nativas.

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_nome_exoticas and pos_gabarito$percentual_acerto$p_nome_nativas
t = 27, df = 370, p-value <2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3388 0.3925
sample estimates:
mean of the differences 
                 0.3657 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_nome_exoticas and pos_gabarito$percentual_acerto$p_nome_nativas
V = 52000, p-value <2e-16
alternative hypothesis: true location shift is not equal to 0

2 - Os alunos identificam mais espécies de origem exótica que as de origem nativa.

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_origem_exoticas and pos_gabarito$percentual_acerto$p_origem_nativas
t = -16, df = 370, p-value <2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3112 -0.2446
sample estimates:
mean of the differences 
                -0.2779 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_origem_exoticas and pos_gabarito$percentual_acerto$p_origem_nativas
V = 4100, p-value <2e-16
alternative hypothesis: true location shift is not equal to 0

3 - Os alunos identificam mais as espécies exóticas (nome dos animais e origem) que espécies nativas.

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_indice_exoticas and pos_gabarito$percentual_acerto$p_indice_nativas
t = 7.6, df = 370, p-value = 2e-13
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.08525 0.14472
sample estimates:
mean of the differences 
                  0.115 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_indice_exoticas and pos_gabarito$percentual_acerto$p_indice_nativas
V = 25000, p-value = 5e-12
alternative hypothesis: true location shift is not equal to 0

4 - Os alunos reconhecem mais mamíferos do que os demais grupos taxonómicos.

tmp <- pos_gabarito$percentual_acerto %>%
    select(p_exotica_aves:p_nativa_reptil) %>%
    melt()
No id variables; using all as measure variables
anova(lm(value ~ origem * grupo, tmp))
Analysis of Variance Table

Response: value
               Df Sum Sq Mean Sq F value  Pr(>F)    
origem          1    123   122.7   597.4 < 2e-16 ***
grupo           4     14     3.6    17.3 4.4e-14 ***
origem:grupo    4     18     4.5    21.7 < 2e-16 ***
Residuals    3660    752     0.2                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(aov(lm(value ~ origem * grupo, tmp)))
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ origem * grupo, tmp))

$origem
                  diff    lwr     upr p adj
nativa-exotica -0.3657 -0.395 -0.3363     0

$grupo
                            diff      lwr      upr  p adj
invertebrado-aves     -1.458e-01 -0.21034 -0.08122 0.0000
mamifero-aves         -8.216e-15 -0.06456  0.06456 1.0000
peixe-aves            -4.905e-02 -0.11361  0.01551 0.2319
reptil-aves           -1.294e-01 -0.19399 -0.06487 0.0000
mamifero-invertebrado  1.458e-01  0.08122  0.21034 0.0000
peixe-invertebrado     9.673e-02  0.03217  0.16129 0.0004
reptil-invertebrado    1.635e-02 -0.04821  0.08091 0.9585
peixe-mamifero        -4.905e-02 -0.11361  0.01551 0.2319
reptil-mamifero       -1.294e-01 -0.19399 -0.06487 0.0000
reptil-peixe          -8.038e-02 -0.14494 -0.01582 0.0062

$`origem:grupo`
                                              diff       lwr       upr  p adj
nativa:aves-exotica:aves                 -0.220708 -0.326612 -0.114804 0.0000
exotica:invertebrado-exotica:aves        -0.032698 -0.138602  0.073206 0.9935
nativa:invertebrado-exotica:aves         -0.479564 -0.585468 -0.373660 0.0000
exotica:mamifero-exotica:aves             0.103542 -0.002362  0.209446 0.0616
nativa:mamifero-exotica:aves             -0.324251 -0.430155 -0.218347 0.0000
exotica:peixe-exotica:aves                0.114441  0.008537  0.220345 0.0222
nativa:peixe-exotica:aves                -0.433243 -0.539147 -0.327339 0.0000
exotica:reptil-exotica:aves              -0.147139 -0.253043 -0.041235 0.0005
nativa:reptil-exotica:aves               -0.332425 -0.438329 -0.226521 0.0000
exotica:invertebrado-nativa:aves          0.188011  0.082107  0.293915 0.0000
nativa:invertebrado-nativa:aves          -0.258856 -0.364760 -0.152952 0.0000
exotica:mamifero-nativa:aves              0.324251  0.218347  0.430155 0.0000
nativa:mamifero-nativa:aves              -0.103542 -0.209446  0.002362 0.0616
exotica:peixe-nativa:aves                 0.335150  0.229246  0.441054 0.0000
nativa:peixe-nativa:aves                 -0.212534 -0.318438 -0.106630 0.0000
exotica:reptil-nativa:aves                0.073569 -0.032335  0.179473 0.4575
nativa:reptil-nativa:aves                -0.111717 -0.217621 -0.005813 0.0291
nativa:invertebrado-exotica:invertebrado -0.446866 -0.552770 -0.340962 0.0000
exotica:mamifero-exotica:invertebrado     0.136240  0.030336  0.242144 0.0019
nativa:mamifero-exotica:invertebrado     -0.291553 -0.397457 -0.185649 0.0000
exotica:peixe-exotica:invertebrado        0.147139  0.041235  0.253043 0.0005
nativa:peixe-exotica:invertebrado        -0.400545 -0.506449 -0.294641 0.0000
exotica:reptil-exotica:invertebrado      -0.114441 -0.220345 -0.008537 0.0222
nativa:reptil-exotica:invertebrado       -0.299728 -0.405632 -0.193824 0.0000
exotica:mamifero-nativa:invertebrado      0.583106  0.477202  0.689010 0.0000
nativa:mamifero-nativa:invertebrado       0.155313  0.049409  0.261217 0.0002
exotica:peixe-nativa:invertebrado         0.594005  0.488101  0.699909 0.0000
nativa:peixe-nativa:invertebrado          0.046322 -0.059582  0.152226 0.9321
exotica:reptil-nativa:invertebrado        0.332425  0.226521  0.438329 0.0000
nativa:reptil-nativa:invertebrado         0.147139  0.041235  0.253043 0.0005
nativa:mamifero-exotica:mamifero         -0.427793 -0.533697 -0.321889 0.0000
exotica:peixe-exotica:mamifero            0.010899 -0.095005  0.116803 1.0000
nativa:peixe-exotica:mamifero            -0.536785 -0.642689 -0.430881 0.0000
exotica:reptil-exotica:mamifero          -0.250681 -0.356585 -0.144777 0.0000
nativa:reptil-exotica:mamifero           -0.435967 -0.541871 -0.330063 0.0000
exotica:peixe-nativa:mamifero             0.438692  0.332788  0.544596 0.0000
nativa:peixe-nativa:mamifero             -0.108992 -0.214896 -0.003088 0.0377
exotica:reptil-nativa:mamifero            0.177112  0.071208  0.283016 0.0000
nativa:reptil-nativa:mamifero            -0.008174 -0.114078  0.097730 1.0000
nativa:peixe-exotica:peixe               -0.547684 -0.653588 -0.441780 0.0000
exotica:reptil-exotica:peixe             -0.261580 -0.367484 -0.155676 0.0000
nativa:reptil-exotica:peixe              -0.446866 -0.552770 -0.340962 0.0000
exotica:reptil-nativa:peixe               0.286104  0.180200  0.392008 0.0000
nativa:reptil-nativa:peixe                0.100817 -0.005087  0.206721 0.0777
nativa:reptil-exotica:reptil             -0.185286 -0.291190 -0.079382 0.0000
# permanova
# library(vegan)
# adonis(value ~ origem * grupo, tmp, permutations=99)

Agrupado por turmas

# Realizando Anova fatorial
anova(lm(value ~ grupo * origem, pos_gabarito$taxonomicos))
Analysis of Variance Table

Response: value
              Df Sum Sq Mean Sq F value Pr(>F)    
grupo          4   0.71    0.18    2.37  0.055 .  
origem         1   5.80    5.80   77.52  2e-15 ***
grupo:origem   4   0.79    0.20    2.63  0.037 *  
Residuals    160  11.98    0.07                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(aov(lm(value ~ grupo * origem, pos_gabarito$taxonomicos)))
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ grupo * origem, pos_gabarito$taxonomicos))

$grupo
                           diff      lwr     upr  p adj
invertebrado-aves     -0.152016 -0.33512 0.03109 0.1533
mamifero-aves          0.002443 -0.18066 0.18554 1.0000
peixe-aves            -0.050865 -0.23397 0.13224 0.9398
reptil-aves           -0.130897 -0.31400 0.05221 0.2842
mamifero-invertebrado  0.154459 -0.02864 0.33756 0.1416
peixe-invertebrado     0.101150 -0.08195 0.28425 0.5483
reptil-invertebrado    0.021119 -0.16198 0.20422 0.9978
peixe-mamifero        -0.053308 -0.23641 0.12979 0.9293
reptil-mamifero       -0.133339 -0.31644 0.04976 0.2663
reptil-peixe          -0.080031 -0.26313 0.10307 0.7479

$origem
                  diff     lwr     upr p adj
nativa-exotica -0.3695 -0.4524 -0.2866     0

$`grupo:origem`
                                              diff     lwr       upr  p adj
invertebrado:exotica-aves:exotica        -0.033503 -0.3347  0.267652 1.0000
mamifero:exotica-aves:exotica             0.103885 -0.1973  0.405040 0.9834
peixe:exotica-aves:exotica                0.109394 -0.1918  0.410549 0.9764
reptil:exotica-aves:exotica              -0.143444 -0.4446  0.157711 0.8788
aves:nativa-aves:exotica                 -0.222463 -0.5236  0.078692 0.3507
invertebrado:nativa-aves:exotica         -0.492991 -0.7941 -0.191836 0.0000
mamifero:nativa-aves:exotica             -0.321463 -0.6226 -0.020307 0.0262
peixe:nativa-aves:exotica                -0.433588 -0.7347 -0.132433 0.0003
reptil:nativa-aves:exotica               -0.340812 -0.6420 -0.039657 0.0135
mamifero:exotica-invertebrado:exotica     0.137388 -0.1638  0.438544 0.9042
peixe:exotica-invertebrado:exotica        0.142898 -0.1583  0.444053 0.8812
reptil:exotica-invertebrado:exotica      -0.109941 -0.4111  0.191214 0.9756
aves:nativa-invertebrado:exotica         -0.188960 -0.4901  0.112195 0.5909
invertebrado:nativa-invertebrado:exotica -0.459488 -0.7606 -0.158333 0.0001
mamifero:nativa-invertebrado:exotica     -0.287959 -0.5891  0.013196 0.0739
peixe:nativa-invertebrado:exotica        -0.400085 -0.7012 -0.098930 0.0014
reptil:nativa-invertebrado:exotica       -0.307309 -0.6085 -0.006154 0.0414
peixe:exotica-mamifero:exotica            0.005509 -0.2956  0.306665 1.0000
reptil:exotica-mamifero:exotica          -0.247329 -0.5485  0.053826 0.2102
aves:nativa-mamifero:exotica             -0.326348 -0.6275 -0.025193 0.0223
invertebrado:nativa-mamifero:exotica     -0.596876 -0.8980 -0.295721 0.0000
mamifero:nativa-mamifero:exotica         -0.425347 -0.7265 -0.124192 0.0005
peixe:nativa-mamifero:exotica            -0.537473 -0.8386 -0.236318 0.0000
reptil:nativa-mamifero:exotica           -0.444697 -0.7459 -0.143542 0.0002
reptil:exotica-peixe:exotica             -0.252838 -0.5540  0.048317 0.1851
aves:nativa-peixe:exotica                -0.331858 -0.6330 -0.030703 0.0185
invertebrado:nativa-peixe:exotica        -0.602386 -0.9035 -0.301230 0.0000
mamifero:nativa-peixe:exotica            -0.430857 -0.7320 -0.129702 0.0004
peixe:nativa-peixe:exotica               -0.542982 -0.8441 -0.241827 0.0000
reptil:nativa-peixe:exotica              -0.450207 -0.7514 -0.149052 0.0002
aves:nativa-reptil:exotica               -0.079019 -0.3802  0.222136 0.9978
invertebrado:nativa-reptil:exotica       -0.349547 -0.6507 -0.048392 0.0099
mamifero:nativa-reptil:exotica           -0.178018 -0.4792  0.123137 0.6712
peixe:nativa-reptil:exotica              -0.290144 -0.5913  0.011011 0.0694
reptil:nativa-reptil:exotica             -0.197368 -0.4985  0.103787 0.5282
invertebrado:nativa-aves:nativa          -0.270528 -0.5717  0.030627 0.1192
mamifero:nativa-aves:nativa              -0.098999 -0.4002  0.202156 0.9881
peixe:nativa-aves:nativa                 -0.211125 -0.5123  0.090030 0.4278
reptil:nativa-aves:nativa                -0.118349 -0.4195  0.182806 0.9606
mamifero:nativa-invertebrado:nativa       0.171529 -0.1296  0.472684 0.7167
peixe:nativa-invertebrado:nativa          0.059403 -0.2418  0.360558 0.9998
reptil:nativa-invertebrado:nativa         0.152179 -0.1490  0.453334 0.8358
peixe:nativa-mamifero:nativa             -0.112126 -0.4133  0.189030 0.9722
reptil:nativa-mamifero:nativa            -0.019350 -0.3205  0.281805 1.0000
reptil:nativa-peixe:nativa                0.092776 -0.2084  0.393931 0.9926

5 - Estudantes que residem na Cidade 1 (com UC) identificam mais espécies nativas do que estudantes que residem na Cidade 2 (sem UC).

t.test(p_indice_nativas ~ municipio, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by municipio
t = 0.65, df = 360, p-value = 0.5
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.02863  0.05711
sample estimates:
mean in group Bela Vista de Goiás            mean in group Silvânia 
                           0.3362                            0.3220 

6 - Estudantes que residem em área rural tem maior conhecimento sobre as espécies nativas.

t.test(p_indice_nativas ~ area, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by area
t = -2, df = 110, p-value = 0.05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.1040103  0.0002798
sample estimates:
 mean in group Rural mean in group Urbana 
              0.2873               0.3392 

7 - Frequencia de contato natureza

anova(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice")))
Analysis of Variance Table

Response: value
            Df Sum Sq Mean Sq F value Pr(>F)
frequencia   4    0.1  0.0247    0.46   0.76
Residuals  729   38.9  0.0533               

8 - Fez aulas praticas

anova(lm(value  ~ fez.aula, data = tmp %>% filter(indicador == "indice")))
Analysis of Variance Table

Response: value
           Df Sum Sq Mean Sq F value Pr(>F)
fez.aula    6    0.2  0.0388    0.73   0.63
Residuals 727   38.7  0.0533               

9 - Estudantes de Silvania que visitam a UC tem maior proporção de acertos espécies nativas.

#normalidade(tmp$p_indice_nativas)
t.test(p_indice_nativas ~ flona, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by flona
t = -1.6, df = 86, p-value = 0.1
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.13024  0.01485
sample estimates:
mean in group Não mean in group Sim 
           0.2808            0.3385 

10 - Ranking dos animais

a1 <- 
    pos_gabarito$raking_animais$nativos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,90)) +
    scale_fill_gradient(low = "orange", high = "red") +
    theme_bw() +
    labs(title = "Espécies citadas como nativas",
       y = "Frequencia", x = "") +
    my_theme
a2 <- 
    pos_gabarito$raking_animais$exoticos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,90)) +
    scale_fill_gradient(low = "lightblue", high = "darkblue") +
    theme_bw() +
    labs(title = "Espécies citadas como exóticas",
       y = "Frequencia", x = "") +
    my_theme
grid.arrange(a1, a2,
             nrow = 2,
             top = textGrob("TOP 20 - Ranking das espécies citadas como exemplo\n", 
                            gp = gpar(fontsize = 20, font = 2))
)

11 - Ranking dos animais citados para proteção

a3 <- 
    pos_gabarito$raking_animais$protegidos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,190)) +
    scale_fill_gradient(low = "green", high = "darkgreen") +
    theme_bw() +
    labs(title = "Espécies citadas como nativas",
       y = "Frequencia", x = "") +
    my_theme
grid.arrange(a3,
             top = textGrob("TOP 20 - Ranking das espécies citadas como exemplo para proteção\n", 
                            gp = gpar(fontsize = 20, font = 2))
)

LS0tCnRpdGxlOiAiTWVzdHJhZG8gQmlvbG9naWEiCmF1dGhvcjogIkhlcnNvbiBNZWxvIgpkYXRlOiAiMjgvMDYvMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkobm9ydGVzdCkKbGlicmFyeShzdGF0cykKbGlicmFyeShtdWx0Y29tcFZpZXcpCgpzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsICdlbl9VUy5VVEYtOCcpKQojb3B0aW9ucyhzY2lwZW4gPSA5OTksIGRpZ2l0cyA9IDQpCm9wdGlvbnMoc2NpcGVuID0gMCwgZGlnaXRzID0gNCkKIyBvcHRpb25zKCJzY2lwZW4iPS0xMDAsICJkaWdpdHMiPTYpCiMgZ2V0d2QoKQpsb2FkKCJkYWRvcy5SRGF0YSIpCgoKbXlfdGhlbWUgPC0gCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9IDEsIHNpemUgPSAxMiksIAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKbm9ybWFsaWRhZGUgPC0gZnVuY3Rpb24oeCkgewogICAgdDEgPC0gc2hhcGlyby50ZXN0KHgpCiAgICB0MiA8LSBzZi50ZXN0KHgpCiAgICB0MyA8LSBsaWxsaWUudGVzdCh4KQogICAgdDQgPC0gYWQudGVzdCh4KQogICAgdDUgPC0gY3ZtLnRlc3QoeCkKICAgIHJldHVybiggZGF0YS5mcmFtZSgKICAgICAgICBBbGdvcml0bW8gPSBjKHQxJG1ldGhvZCwgdDIkbWV0aG9kLCAKICAgICAgICAgICAgICAgICAgIHQzJG1ldGhvZCwgdDQkbWV0aG9kLCAKICAgICAgICAgICAgICAgICAgIHQ1JG1ldGhvZCksCiAgICAgICAgcC52YWxvciA9IGModDEkcC52YWx1ZSwgdDIkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgdDMkcC52YWx1ZSwgdDQkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgdDUkcC52YWx1ZSksCiAgICAgICAgTm9ybWFsaWRhZGUgPSBjKHQxJHAudmFsdWUgPiAuMDUsIHQyJHAudmFsdWUgPiAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgdDMkcC52YWx1ZSA+IC4wNSwgdDQkcC52YWx1ZSA+IC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICB0NSRwLnZhbHVlID4gLjA1KQogICAgKSkKfQojIEltcGxlbWVudGFuZG8gZm9ybXVsYSBwYXJhIHRlc3RlcyBlc3RhdMOtc3RpY29zIHBhZHJvbml6YWRhCnRlc3RlLmFub3ZhIDwtIGZ1bmN0aW9uKGZvcm11bGEsIGRhdGEpIHsKICAgIHQubm9ybWFsaWRhZGUgPC0gCiAgICAgICAgYWdncmVnYXRlKGZvcm11bGEsIGRhdGEsIAogICAgICAgICAgICAgICAgICBGVU4gPSBmdW5jdGlvbih4KSBzaGFwaXJvLnRlc3QoeCkkcC52YWx1ZSkgJT4lCiAgICAgICAgbXV0YXRlKEgwID0gKHZhbHVlIDw9IDAuMDUpLAogICAgICAgICAgICAgICBub3JtYWxpZGFkZSA9IGNlbGxfc3BlYyhIMCwgYm9sZCA9IEgwLAogICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZShIMCwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMCwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICAgICAgICAgICAgICAgKSAlPiUKICAgICAgICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICAgICAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogICAgICAgIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQoKICAgIHQuYW5vdmEgPC0gYW5vdmEobG0oZm9ybXVsYSwgZGF0YSkpCiAgICB0LnR1a2V5IDwtIFR1a2V5SFNEKGFvdihsbShmb3JtdWxhLCBkYXRhKSkpCgogICAgaWYobGVuZ3RoKHQudHVrZXkpID4gMSkgewogICAgICAgIGVycm9yKCJBTk9WQSBmYXRvcmlhbCAoZmFsdGEgdHJhdGFyIGlzc28pISIpCiAgICB9CiAgICB0dWtleS50YmwgPC0gYXMuZGF0YS5mcmFtZSh0LnR1a2V5W1sxXV0sIGN1dC5uYW1lcyA9IEYpCiAgICB0dWtleS50YmwkY29tcGFyYWNhbyA9IHJvd25hbWVzKHR1a2V5LnRibCkKICAgIHJvd25hbWVzKHR1a2V5LnRibCkgPSBOVUxMCiAgICB0YWJlbGEudHVrZXkgPC0gdHVrZXkudGJsICU+JQogICAgICAgIG11dGF0ZShIMCA9IChgcCBhZGpgIDw9IDAuMDUpLAogICAgICAgICAgICAgICBzaWduaWZpY2FuY2lhID0gY2VsbF9zcGVjKEgwLCBib2xkID0gSDAsCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gaWZlbHNlKEgwLCAid2hpdGUiLCAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKEgwLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKQogICAgICAgICAgICAgICApICU+JQogICAgICAgIHNlbGVjdChjb21wYXJhY2FvLCBkaWZmOmBwIGFkamAsIHNpZ25pZmljYW5jaWEpICU+JQogICAgICAgIGthYmxlKGVzY2FwZSA9IEYpICU+JQogICAgICAgIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgICAgICAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCiAgICAKICAgICAgICAKICAgIHJlc3VsdGFkbyA8LSAKICAgICAgICBsaXN0KAogICAgICAgICAgICB0ZXN0ZS5ub3JtYWxpZGFkZSA9IHQubm9ybWFsaWRhZGUsCiAgICAgICAgICAgIHRlc3RlLmFub3ZhID0gdC5hbm92YSwKICAgICAgICAgICAgdHVrZXkgPSB0LnR1a2V5LAogICAgICAgICAgICB0YWJlbGEudHVrZXkgPSB0YWJlbGEudHVrZXkKICAgICAgICApCiAgICByZXR1cm4ocmVzdWx0YWRvKQp9CgppYy5tZWRpYSA8LSBmdW5jdGlvbih2ZXRvckRhZG9zKXsKICAgICMjIwogICAgIyMgQ2FsY3VsYW5kbyBvIGludGVydmFsbyBkZSBjb25maWFuw6dhCiAgICAjIyMKICAgIG1lZGlhIDwtIG1lYW4odmV0b3JEYWRvcykgI23DqWRpYSBkYSBhbW9zdHJhCiAgICBzIDwtIHNkKHZldG9yRGFkb3MpICNkZXN2aW8gcGFkcsOjbwogICAgbiA8LSBsZW5ndGgodmV0b3JEYWRvcykgI3RhbWFuaG8gZGEgYW1vc3RyYQogICAgZXJyb1BhZHJhbyA8LSBxbm9ybSgwLjk3NSkqcy9zcXJ0KG4pCiAgICBsaW1pdGUgPC0gMS45NiAqIGVycm9QYWRyYW8KICAgIGVycm9yLmluZmVyaW9yIDwtIG1lZGlhIC0gZXJyb1BhZHJhbwogICAgZXJyb3Iuc3VwZXJpb3IgPC0gbWVkaWEgKyBlcnJvUGFkcmFvCiAgICBsaW1pdGUuaW5mZXJpb3IgPC0gbWVkaWEgLSBsaW1pdGUKICAgIGxpbWl0ZS5zdXBlcmlvciA8LSBtZWRpYSArIGxpbWl0ZQogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgICAgbWVkaWEsIAogICAgICAgIGRlc3ZpbyA9IHMsIAogICAgICAgIGVycm9QYWRyYW8sIAogICAgICAgIGVycm9yLmluZmVyaW9yLCBlcnJvci5zdXBlcmlvciwgCiAgICAgICAgbGltaXRlLmluZmVyaW9yLCBsaW1pdGUuc3VwZXJpb3IpKQp9CgpwbG90QW5hbGlzZU1lZGlhcyA8LSBmdW5jdGlvbih2ZXRvckV4b3RpY2FzLCB2ZXRvck5hdGl2YXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXR1bG8gPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0ZXh0ID0gIk3DqWRpYSBwZXJjZW50dWFsIGRlIGFjZXJ0b3NcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXhvdGljYXMgPSAwLCBtZWRpYU5hdGl2YXMgPSAwKSB7CiAgICB0bXAgPC0gcmJpbmQoCiAgICAgICAgY2JpbmQob3JpZ2VtID0gIkV4b3RpY2FzIiwgaWMubWVkaWEodmV0b3JFeG90aWNhcykpLAogICAgICAgIGNiaW5kKG9yaWdlbSA9ICJOYXRpdmFzIiwgaWMubWVkaWEodmV0b3JOYXRpdmFzKSkjLAogICAgICAgICNjYmluZChvcmlnZW0gPSAiRGlmZXJlbsOnYSIsIGljLm1lZGlhKHZldG9yRXhvdGljYXMgLSB2ZXRvck5hdGl2YXMpKQogICAgKQogICAgIyBsaW1pdGVzRXNjYWxhID0gYyhtaW4odG1wJGxpbWl0ZS5pbmZlcmlvcikqMC44LCAjIDIwJSBhIG1lbm9zIGRvIG1lbm9yIGxpbWl0ZSBpbmZlcmlvciAKICAgICMgICAgICAgICAgICAgICAgICAgbWF4KHRtcCRsaW1pdGUuc3VwZXJpb3IpKjEuMikgIyAyMCUgYSBtYWlzIGRvIG1lbm9yIGxpbWl0ZSBzdXBlcmlvciAKICAgIGxpbWl0ZXNFc2NhbGEgPC0gYygwLDEpCiAgICAKICAgIHAgPC0gCiAgICAgICAgZ2dwbG90KHRtcCwgYWVzKG9yaWdlbSwgbWVkaWEpKSArCiAgICAgICAgZ2VvbV9jcm9zc2JhcihhZXMoeW1pbiA9IGVycm9yLmluZmVyaW9yLCB5bWF4ID0gZXJyb3Iuc3VwZXJpb3IpLCB3aWR0aCA9IDAuMSkgKwogICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsaW1pdGUuaW5mZXJpb3IsIHltYXggPSBsaW1pdGUuc3VwZXJpb3IpLCB3aWR0aCA9IDAuMSkgKwogICAgICAgIGdlb21fcG9pbnQoYWVzKG9yaWdlbSwgbWVkaWEpKSArCiAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVkaWFFeG90aWNhcywgbGluZXR5cGUgPSAyLCBjb2xvdXI9ImRhcmtibHVlIikgKwogICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lZGlhTmF0aXZhcywgbGluZXR5cGUgPSAxLCBjb2xvdXI9InJlZCIpICsKICAgICAgICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlkgc2VyaWVzIiwgbGFiZWxzID0gYygiWTIiLCAiWTEiKSkgKwogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBsaW1pdGVzRXNjYWxhLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgICAgICBsYWJzKHRpdGxlID0gdGl0dWxvLAogICAgICAgICAgICAgeCA9ICIiLAogICAgICAgICAgICAgeSA9IHl0ZXh0LAogICAgICAgICAgICAgY29sb3IgPSAnTcOpZGlhcyBvcmlnZW5zIGdlcmFsJykgKyAKICAgICAgICBteV90aGVtZSArIAogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgICByZXR1cm4ocCkKfQojIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfZXhvdGljYXMsCiMgICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9uYXRpdmFzLAojICAgICAgICAgICAgICAgICAgICJJZGVudGlmaWNhw6fDo28gZG9zIG5vbWVzIikKCmBgYAoKIyMgQW7DoWxpc2UgZG8gSm9nbyBkZSBJbWFnZW5zIGFwbGljYWRhcyBubyBFbnNpbm8gbcOpZGlvCgoKIyMjIEFtb3N0cmEgZG9zIGRhZG9zIGRhIHBlc3F1aXNhIHJlYWxpemFkYQoKVGFidWxhw6fDo28gZG8gbsO6bWVybyBkZSBhY2VydG9zIGRvcyBpdGVucyBkbyBqb2dvIGRlIGltYWdlbnMuCgpgYGB7ciwgZWNobz1GQUxTRX0KZGVzY19jb2x1bmFzIDwtIGRhdGEuZnJhbWUoCiAgICAiQ29sdW5hIiA9IGMoIkV4b3RpY2FzIiwgIk5hdGl2YXMiKSwKICAgICJEZXNjcmnDp8OjbyIgPSBjKCJOw7ptZXJvIGRlIGFjZXJ0b3MgZGVudHJlIHRvZGFzIGFzIGltYWdlbnMgZXhpYmlkYXMgZG8gdGlwbyBleMOzdGljYSwgdmFsb3IgZXhwZXJhZG8gw6kgNS4iLAogICAgICAgICAgICAgICAgICAgICJOw7ptZXJvIGRlIGFjZXJ0b3MgZGVudHJlIHRvZGFzIGFzIGltYWdlbnMgZXhpYmlkYXMgZG8gdGlwbyBuYXRpdmEsIHZhbG9yIGV4cGVyYWRvIMOpIDUuIikKICAgICkKZGVzY19jb2x1bmFzICU+JQogIGthYmxlKCkgJT4lCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImJvcmRlcmVkIiksIGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUKICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkKCmBgYAoKCmBgYHtyfQpoZWFkKHBvc19nYWJhcml0byRkYWRvcywgMTApCmBgYAoKIyMjIyBEZXRlcm1pbmFkbyBhIHRheGEgZGUgcGVyY2Vww6fDo28KCkVudGVuZGUtc2UgcG9yIHRheGEgZGUgcGVyY2Vww6fDo28gbyBmYXRvciBkZXRlcm1pbmFkbyBwZWxhIHF1YW50aWRhZGUgbcOpZGlhIGRlIGFjZXJ0b3MgZGVudHJlIGFzIHF1ZXN0w7VlcyBhcHJlc2VudGFkYXMgYW9zIGFsdW5vcywgZW0gcmVsYcOnw6NvIGEgdHVybWEgZW0gcXVlIG8gcXVlc3Rpb25hcmlvIGZvaSBhcGxpY2Fkby4KClBlcmNlcMOnw6NvIGRvcyBhbHVub3MKCmBgYHtyfQpwcmludChwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8pCmBgYAoKIyMjIyBFbnRlbmRlbmRvIGEgZGlzdHJpYnVpw6fDo28gZGFzIG3DqWRpYXMKCk7DrXZlaXMgZGUgcmVjb25oZWNpbWVudG8gKGFjZXJ0b3MpIHBvciB0aXBvIGRlIG9yaWdlbSBkb3MgYW5pbWFpcwoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9CmdyaWQuYXJyYW5nZSgKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfZXhvdGljYXMsCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfbmF0aXZhcywKICAgICAgICAgICAgICAgICAgIklkZW50aWZpY2HDp8OjbyBkb3Mgbm9tZXMiKSwKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9leG90aWNhcywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX25hdGl2YXMsCiAgICAgICAgICAgICAgICAgICJJZGVudGlmaWNhw6fDo28gZGFzIG9yaWdlbnMiLCB5ID0gIiIpLAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzLAogICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcywKICAgICAgICAgICAgICAgICAgIlRheGEgZGUgcmVjb25oZWNpbWVudG8iLCB5ID0gIiIpLCAKICAgIG5jb2wgPSAzLAogICAgdG9wID0gdGV4dEdyb2IoIk5pdmVpcyBkZSByZWNvbmhlY2ltZW50byBwb3Igb3JpZ2VtXG4iLCAKICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpLAogICAgcmlnaHQgPSAiXG4iCikKYGBgCgpEaWZlcmVuw6dhIGRlIGFjZXJ0b3MKCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD00fQpncmlkLmFycmFuZ2UoCiAgICBnZ3Bsb3QocG9zX2dhYmFyaXRvJGRhZG9zLCBhZXMoZXhvdGljYXMgLSBuYXRpdmFzKSkgKwogICAgICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCkgKwogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTMwKSkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC01LDUpKSArCiAgICAgICAgbGFicyh0aXRsZSA9ICJJZGVudGlmaWNhw6fDo28gZG9zIG5vbWVzIiwgeSA9ICJUb3RhbCBkZSBhY2VydG9zIikgKwogICAgICAgIG15X3RoZW1lLAogICAgZ2dwbG90KHBvc19nYWJhcml0byRkYWRvcywgYWVzKG9yaWdlbV9leG90aWNhcyAtIG9yaWdlbV9uYXRpdmFzKSkgKwogICAgICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCkgKwogICAgICAgICNnZW9tX2RlbnNpdHkoZmlsbCA9ICJyZWQiKSArCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMzApKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTUsNSkpICsKICAgICAgICBsYWJzKHRpdGxlID0gIklkZW50aWZpY2HDp8OjbyBkYXMgb3JpZ2VucyIsIHkgPSAiIikgKwogICAgICAgIG15X3RoZW1lLAogICAgZ2dwbG90KHBvc19nYWJhcml0byRkYWRvcywgYWVzKGluZGljZV9leG90aWNhcyAtIGluZGljZV9uYXRpdmFzKSkgKwogICAgICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCwgZmlsbCA9ICJkYXJrYmx1ZSIpICsKICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEzMCkpICsKICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSw1KSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiVGF4YSBkZSByZWNvbmhlY2ltZW50byIsIHkgPSAiIikgKwogICAgICAgIG15X3RoZW1lLCAKICAgIGdndGV4dHRhYmxlKG5vcm1hbGlkYWRlKHBvc19nYWJhcml0byRkYWRvcyRleG90aWNhcyAtIHBvc19nYWJhcml0byRkYWRvcyRuYXRpdmFzKSwKICAgICAgICAgICAgICAgIHJvd3MgPSBOVUxMLCB0aGVtZSA9IHR0aGVtZShiYXNlX3N0eWxlID0gIm1PcmFuZ2UiLCBiYXNlX3NpemUgPSA5KSksCiAgICBnZ3RleHR0YWJsZShub3JtYWxpZGFkZShwb3NfZ2FiYXJpdG8kZGFkb3Mkb3JpZ2VtX2V4b3RpY2FzIC0gcG9zX2dhYmFyaXRvJGRhZG9zJG9yaWdlbV9uYXRpdmFzKSwKICAgICAgICAgICAgICAgIHJvd3MgPSBOVUxMLCB0aGVtZSA9IHR0aGVtZShiYXNlX3N0eWxlID0gIm1PcmFuZ2UiLCBiYXNlX3NpemUgPSA5KSksCiAgICBnZ3RleHR0YWJsZShub3JtYWxpZGFkZShwb3NfZ2FiYXJpdG8kZGFkb3MkaW5kaWNlX2V4b3RpY2FzIC0gcG9zX2dhYmFyaXRvJGRhZG9zJGluZGljZV9uYXRpdmFzKSwKICAgICAgICAgICAgICAgIHJvd3MgPSBOVUxMLCB0aGVtZSA9IHR0aGVtZShiYXNlX3N0eWxlID0gIm1PcmFuZ2UiLCBiYXNlX3NpemUgPSA5KSksCiAgICBuY29sID0gMywKICAgIHRvcCA9IHRleHRHcm9iKCJIaXN0b2dyYW1hIGRhcyBkaWZlcmVuw6dhcyBFeG90aWNhcyB4IE5hdGl2YXNcbiIsIAogICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSksCiAgICBoZWlnaHRzPWMoMy80LCAxLzQpLAogICAgcmlnaHQgPSAiXG4iLAogICAgYm90dG9tID0gIlxuIgopCmBgYAoKR3J1cG9zIHRheG9uw7NtaWNvcwoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTMuNX0KcmJpbmQoCiAgICBjYmluZChncnVwbyA9ICJBdmVzIiwgb3JpZ2VtID0gImV4b3RpY2EiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX2F2ZXMpKSksCiAgICBjYmluZChncnVwbyA9ICJBdmVzIiwgb3JpZ2VtID0gIm5hdGl2YSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9hdmVzKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiSW52ZXJ0ZWJyYWRvcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9pbnZlcnRlYnJhZG8pKSksCiAgICBjYmluZChncnVwbyA9ICJJbnZlcnRlYnJhZG9zIiwgb3JpZ2VtID0gIm5hdGl2YSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9pbnZlcnRlYnJhZG8pKSksCiAgICBjYmluZChncnVwbyA9ICJNYW1pZmVyb3MiLCBvcmlnZW0gPSAiZXhvdGljYSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfbWFtaWZlcm8pKSksCiAgICBjYmluZChncnVwbyA9ICJNYW1pZmVyb3MiLCBvcmlnZW0gPSAibmF0aXZhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX21hbWlmZXJvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiUGVpeGVzIiwgb3JpZ2VtID0gImV4b3RpY2EiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX3BlaXhlKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiUGVpeGVzIiwgb3JpZ2VtID0gIm5hdGl2YSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9wZWl4ZSkpKSwKICAgIGNiaW5kKGdydXBvID0gIlLDqXB0ZWlzIiwgb3JpZ2VtID0gImV4b3RpY2EiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX3JlcHRpbCkpKSwKICAgIGNiaW5kKGdydXBvID0gIlLDqXB0ZWlzIiwgb3JpZ2VtID0gIm5hdGl2YSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9yZXB0aWwpKSkKKSAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKHg9VmFyMSwgeSA9IEZyZXEsIGZpbGwgPSBvcmlnZW0pKSArIAogICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjUsIHBvc2l0aW9uID0gImRvZGdlIikgKwogICAgICAgIGZhY2V0X3dyYXAofmdydXBvLCBzY2FsZXMgPSAiZnJlZSIpICsgCiAgICAgICAgbGFicyh0aXRsZSA9ICJQZXJjZW50dWFsIGRlIGFjZXJ0byB4IGdydXBvcyB0YXhvbm9taWNvc1xuIiwgCiAgICAgICAgICAgICB5ID0gIkZyZXF1ZW5jaWEiLCB4ID0gIlBlcmNlbnR1YWwgZGUgYWNlcnRvIikgKwogICAgICAgIG15X3RoZW1lCgpgYGAKCgoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CmdyaWQuYXJyYW5nZSgKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfYXZlcywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX2F2ZXMsCiAgICAgICAgICAgICAgICAgICJBdmVzIiwgIk3DqWRpYSBwZXJjZW50dWFsIGRlIGFjZXJ0b3NcbiIsCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzKSwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcykpLAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9pbnZlcnRlYnJhZG8sCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9pbnZlcnRlYnJhZG8sCiAgICAgICAgICAgICAgICAgICJJbnZlcnRlYnJhZG9zIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfbWFtaWZlcm8sCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9tYW1pZmVybywKICAgICAgICAgICAgICAgICAgIk1hbWlmZXJvcyIsIHkgPSAiIiwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMpLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzKSksIAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9wZWl4ZSwKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX3BlaXhlLAogICAgICAgICAgICAgICAgICAiUGVpeGVzIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwgCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX3JlcHRpbCwKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX3JlcHRpbCwKICAgICAgICAgICAgICAgICAgIlLDqXB0ZWlzIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwgCiAgICBuY29sID0gNSwKICAgIHRvcCA9IHRleHRHcm9iKCJOaXZlaXMgZGUgcmVjb25oZWNpbWVudG8gcG9yIG9yaWdlbVxuIiwgCiAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKSwKICAgIHJpZ2h0ID0gIlxuIgopCmBgYAoKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zfQpjaWRhZGUxIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0b1twb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kbXVuaWNpcGlvID09ICJTaWx2w6JuaWEiLF0KY2lkYWRlMiA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG9bcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJG11bmljaXBpbyA9PSAiQmVsYSBWaXN0YSBkZSBHb2nDoXMiLF0KZ3JpZC5hcnJhbmdlKAogICAgcGxvdEFuYWxpc2VNZWRpYXMoCiAgICAgICAgY2lkYWRlMSRwX2luZGljZV9leG90aWNhcywKICAgICAgICBjaWRhZGUxJHBfaW5kaWNlX25hdGl2YXMsCiAgICAgICAgIlNpbHbDom5pYSIpLAogICAgcGxvdEFuYWxpc2VNZWRpYXMoCiAgICAgICAgY2lkYWRlMiRwX2luZGljZV9leG90aWNhcywKICAgICAgICBjaWRhZGUyJHBfaW5kaWNlX25hdGl2YXMsCiAgICAgICAgIkJlbGEgVmlzdGEgZGUgR29pw6FzIiwgeXRleHQgPSAiIiksCiAgICBuY29sID0gMiwKICAgIHRvcCA9IHRleHRHcm9iKCJOaXZlaXMgZGUgcmVjb25oZWNpbWVudG8gcG9yIG9yaWdlbVxuIiwgCiAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKSwKICAgIHJpZ2h0ID0gIlxuIgopCmBgYAoKTWVkaW5kbyBhcyBtw6lkaWFzIGRlIGFjZXJ0byBuYSBpZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQojIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKIyAgICAgZ3JvdXBfYnkobXVuaWNpcGlvKSAlPiUKIyAgICAgc3VtbWFyaXNlKGV4b3RpY2FzID0gbWVhbihwX2luZGljZV9leG90aWNhcyksCiMgICAgICAgICAgICAgICBuYXRpdmFzID0gbWVhbihwX2luZGljZV9uYXRpdmFzKSkgJT4lCiMgICAgIHVuZ3JvdXAoKSAlPiUKIyAgICAgbWVsdChpZCA9ICJtdW5pY2lwaW8iKSAlPiUKIyAgICAgZ2dwbG90KGFlcyhtdW5pY2lwaW8sIHZhbHVlLCBmaWxsID0gdmFyaWFibGUpKSArCiMgICAgIGZhY2V0X3dyYXAofnZhcmlhYmxlKSsKIyAgICAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEYpICsKIyAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGljLm1lZGlhKHZhcmlhYmxlKSRlcnJvcl9pbmZlcmlvciwgeW1heCA9IGljLm1lZGlhKHZhcmlhYmxlKSRlcnJvcl9zdXBlcmlvciApKSArCiMgICAgIGxhYnModGl0bGUgPSAiTcOpZGlhIGRlIHRheGEgZGUgcmVjb25oZWNpbWVudG8gZGFzIG9yaWdlbnMgZXjDs3RpY2FzIHBvciBtdW5pY2lwaW9cbiIsCiMgICAgICAgICAgeCA9ICIiLCB5ID0gIlBlcmNlbnR1YWwgbcOpZGlvIGRlIGFjZXJ0b1xuIikgKwojICAgICBteV90aGVtZQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xLjV9CmJhcnBsb3QodGFwcGx5KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRtdW5pY2lwaW8sCiAgICBtZWFuKSwgbWFpbiA9ICJNw6lkaWEgZGUgdGF4YSBkZSByZWNvbmhlY2ltZW50byBkYXMgb3JpZ2VucyBleMOzdGljYXMgcG9yIGFyZWFzIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xLjV9CmJhcnBsb3QodGFwcGx5KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRhcmVhLAogICAgbWVhbiksIG1haW4gPSAiTcOpZGlhIGRlIHRheGEgZGUgcmVjb25oZWNpbWVudG8gZGFzIG9yaWdlbnMgZXjDs3RpY2FzIHBvciBhcmVhcyIpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xLjV9CmJhcnBsb3QodGFwcGx5KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJGFyZWEsCiAgICBtZWFuKSwgbWFpbiA9ICJNw6lkaWEgZGUgdGF4YSBkZSByZWNvbmhlY2ltZW50byBkYXMgb3JpZ2VucyBleMOzdGljYXMgcG9yIGFyZWFzIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xLjV9CmJhcnBsb3QodGFwcGx5KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byR0dXJtYXMsCiAgICBtZWFuKSwgbWFpbiA9ICJNw6lkaWEgZGUgdGF4YSBkZSByZWNvbmhlY2ltZW50byBkYXMgb3JpZ2VucyBleMOzdGljYXMgcG9yIHR1cm1hcyIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9MS41fQpiYXJwbG90KHRhcHBseSgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byR0dXJtYXMsCiAgICBtZWFuKSwgbWFpbiA9ICJNw6lkaWEgZGUgdGF4YSBkZSByZWNvbmhlY2ltZW50byBkYXMgb3JpZ2VucyBuYXRpdmFzIHBvciB0dXJtYXMiKQpgYGAKCgojIyMgVGVzdGUgZGUgbm9ybWFsaWRhZGUKClBhcmEgZGV0ZXJtaW5hciBhIG5vcm1hbGlkYWRlIG5hcyBkaXN0cmlidWnDp29lcyBkYXMgcmVzcG9zdGFzIGRvIGpvZ28gZGUgaW1hZ2Vucy4KCmBgYHtyLCBlY2hvPUZBTFNFfQpncmFmaWNvX2RlbnNpZGFkZSA8LSBmdW5jdGlvbih2YXJpYXZlbCwgY29yLCB0aXR1bG8pIHsKICAgIHBsb3QgPC0gCiAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hICU+JSAKICAgICAgICBnZ2RlbnNpdHkoeCA9IHZhcmlhdmVsLCBmaWxsID0gY29yLAogICAgICAgICAgbWFpbiA9IHRpdHVsbywKICAgICAgICAgIHhsYWIgPSAiUGVyY2VudHVhbCBkZSBhY2VydG9zIikgKyAKICAgICAgICB4bGltKDAsIDEpICsgCiAgICAgICAgeWxpbSgwLCA4KQogICAgbm9tYWxpZGFkZSA8LSAKICAgICAgICBnZ3RleHR0YWJsZSgKICAgICAgICAgICAgbm9ybWFsaWRhZGUocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hW1t2YXJpYXZlbF1dKSwgCiAgICAgICAgICAgIHJvd3MgPSBOVUxMLCB0aGVtZSA9IHR0aGVtZShiYXNlX3N0eWxlID0gIm1PcmFuZ2UiLCBiYXNlX3NpemUgPSA4KQogICAgICAgICkKICAgIAogICAgcmVzdWx0YWRvIDwtIGxpc3QoCiAgICAgICAgcGxvdCA9IHBsb3QsCiAgICAgICAgbm9ybWFsaWRhZGUgPSBub21hbGlkYWRlCiAgICApCiAgICByZXR1cm4ocmVzdWx0YWRvKQp9Cgp0MSA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9uYXRpdmFzIiwgImdyZWVuIiwgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIE5hdGl2YXMiKQp0MiA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9leG90aWNhcyIsICJyZWQiLCAiSWRlbnRpZmljYcOnw6NvIGRvIG5vbWUgZGFzIGVzcMOpY2llcyBkZSBvcmlnZW0gRXjDs3RpY2FzIikKdDMgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfb3JpZ2VtX25hdGl2YXMiLCAiZGFya2dyZWVuIiwgIklkZW50aWZpY2HDp8OjbyBkZSBvcmlnZW0gTmF0aXZhcyIpCnQ0IDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX29yaWdlbV9leG90aWNhcyIsICJkYXJrcmVkIiwgIklkZW50aWZpY2HDp8OjbyBkZSBvcmlnZW0gRXjDs3RpY2FzIikKdDUgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfaW5kaWNlX25hdGl2YXMiLCAib3JhbmdlIiwgIkluZGljZSBkZSByZWNvbmhlY2ltZW50byBOYXRpdmFzIChvcmlnZW5zICsgZXNww6ljaWVzKSIpCnQ2IDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX2luZGljZV9leG90aWNhcyIsICJvcmFuZ2VyZWQiLCAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIEV4w7N0aWNhcyAob3JpZ2VucyArIGVzcMOpY2llcykiKQpgYGAKCiMjIyMgSWRlbnRpZmljYcOnw6NvIG3DqWRpbyBkYXMgdHVybWFzIChub21lcyBkYXMgZXNww6ljaWVzICYgb3JpZ2VucykKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTV9CmdyaWQuYXJyYW5nZSh0MSRwbG90LCB0MiRwbG90LAogICAgICAgICAgICAgdDEkbm9ybWFsaWRhZGUsIHQyJG5vcm1hbGlkYWRlLAogICAgICAgICAgICAgdDMkcGxvdCwgdDQkcGxvdCwKICAgICAgICAgICAgIHQzJG5vcm1hbGlkYWRlLCB0NCRub3JtYWxpZGFkZSwKICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMywyLDMsMiksCiAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiRGVuc2lkYWRlIGRlIGlkZW50aWZpY2HDp8OjbyBtw6lkaWEgZGFzIHR1cm1hcyBlbnRyZSBcbmVzcGVjaWVzIGUgc3VhcyBvcmlnZW5zXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKICAgICAgICAgICAgICkKYGBgCgojIyMjIEluZGljZSBkZSByZWNvbmhlY2ltZW50byBtw6lkaW8gZGFzIHR1cm1hcwoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KZ3JpZC5hcnJhbmdlKHQ1JHBsb3QsIHQ2JHBsb3QsCiAgICAgICAgICAgICB0NSRub3JtYWxpZGFkZSwgdDYkbm9ybWFsaWRhZGUsCiAgICAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgICAgIGhlaWdodHMgPSBjKDQsMyksCiAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiRGVuc2lkYWRlIGRvcyBpbmRpY2VzIGRlIHJlY29uaGVjaW1lbnRvIG3DqWRpbyBkYXMgdHVybWFzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKICAgICAgICAgICAgICkKYGBgCgoKIyMjIFEtUSBUZXN0CgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0KcXFwbG90LmRhdGEgPC0gZnVuY3Rpb24gKHZlYywgdGl0dWxvKSB7CiAgIyBmb2xsb3dpbmcgZm91ciBsaW5lcyBmcm9tIGJhc2UgUidzIHFxbGluZSgpCiAgeSA8LSBxdWFudGlsZSh2ZWNbIWlzLm5hKHZlYyldLCBjKDAuMjUsIDAuNzUpKQogIHggPC0gcW5vcm0oYygwLjI1LCAwLjc1KSkKICBzbG9wZSA8LSBkaWZmKHkpL2RpZmYoeCkKICBpbnQgPC0geVsxTF0gLSBzbG9wZSAqIHhbMUxdCgogIGQgPC0gZGF0YS5mcmFtZShyZXNpZHMgPSB2ZWMpCgogIGdncGxvdChkLCBhZXMoc2FtcGxlID0gcmVzaWRzKSkgKyAKICAgICAgc3RhdF9xcSgpICsgCiAgICAgIGdlb21fYWJsaW5lKHNsb3BlID0gc2xvcGUsIGludGVyY2VwdCA9IGludCwgY29sID0gInJlZCIpICsKICAgICAgeGxpbSgtMiwgMikgKwogICAgICB5bGltKDAsIDEpICsKICAgICAgdGhlbWVfYncoKSArCiAgICAgIGxhYnMoCiAgICAgICAgdGl0bGUgPSB0aXR1bG8KICAgICkKfQoKcTEgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfbmF0aXZhcywgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIE5hdGl2YXMiKQpxMiA8LSBxcXBsb3QuZGF0YShwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9leG90aWNhcywgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIEV4b3RpY2FzIikKcTMgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX25hdGl2YXMsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIE5hdGl2YXMiKQpxNCA8LSBxcXBsb3QuZGF0YShwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9vcmlnZW1fZXhvdGljYXMsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIEV4b3RpY2FzIikKcTUgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX25hdGl2YXMsICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gTmF0aXZhcyAob3JpZ2VucyArIGVzcMOpY2llcykiKQpxNiA8LSBxcXBsb3QuZGF0YShwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9pbmRpY2VfZXhvdGljYXMsICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gRXhvdGljYXMgKG9yaWdlbnMgKyBlc3DDqWNpZXMpIikKCmdyaWQuYXJyYW5nZShxMSwgcTIsIAogICAgICAgICAgICAgcTMsIHE0LAogICAgICAgICAgICAgcTUsIHE2LAogICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiTm9ybWFsIFEtUSBQbG90XG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCiAgICAgICAgICAgICApCmBgYAoKIyMjIFRlc3RlIGRlIHZhcmnDom5jaWEKClBhcmEgZGV0ZXJtaW5hciBhIHZhcmnDom5jaWEKCmBgYHtyfQp2YXJpYW5jaWEgPC0gZGF0YS5mcmFtZSgKICAgIEFsZ29yaXRtbyA9IGMoIkYgdGVzdCB0byBjb21wYXJlIHR3byB2YXJpYW5jZXMiKSwKICAgICJDb21wYXJhw6fDo28iID0gYygiTmF0aXZhcyB4IEV4w7N0aWNhcyIpLAogICAgIlZhcmnDoXZlbCIgPSBjKAogICAgICAgICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8iLAogICAgICAgICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRhIG9yaWdlbSIKICAgICksCiAgICAicF92YWxvciIgPSBjKAogICAgICAgIHZhci50ZXN0KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2luZGljZV9uYXRpdmFzLCAKICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9pbmRpY2VfZXhvdGljYXMsIAogICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpJHAudmFsdWUsCiAgICAgICAgdmFyLnRlc3QocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfbmF0aXZhcywgCiAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfZXhvdGljYXMsIAogICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpJHAudmFsdWUsCiAgICAgICAgdmFyLnRlc3QocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX25hdGl2YXMsIAogICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9leG90aWNhcywgCiAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikkcC52YWx1ZQogICAgKQopCgp2YXJpYW5jaWEgPC0gdmFyaWFuY2lhICU+JQogICAgbXV0YXRlKAogICAgICAgIHZhcmlhbmNpYSA9IHBfdmFsb3IgPiAwLjA1LAogICAgICAgIHBfdmFsb3IgPSBjZWxsX3NwZWMocm91bmQocF92YWxvciwgNCksIGJvbGQgPSBULCBjb2xvciA9ICJibGFjayIsIGFsaWduID0gInJpZ2h0IiksCiAgICAgICAgdmFyaWFuY2lhID0gY2VsbF9zcGVjKHZhcmlhbmNpYSwgYm9sZCA9IHZhcmlhbmNpYSwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj0gaWZlbHNlKHZhcmlhbmNpYSwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBpZmVsc2UodmFyaWFuY2lhLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKQogICAgKQoKdmFyaWFuY2lhICU+JQogIGthYmxlKGVzY2FwZSA9IEYpICU+JQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIGNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDE6MiwgdmFsaWduID0gInRvcCIpIApgYGAKCiMjIyBBbmFsaXNlcyBkZXNjcml0aXZhcwoKYGBge3J9CmhlYWQocG9zX2dhYmFyaXRvJGVzcGVjaWVzLCAxMCkKYGBgCgojIyMjIEluZGljZSBkZSBpZGVudGlmaWNhw6fDo28gcG9yIE9yaWdlbQoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CnBvc19nYWJhcml0byRlc3BlY2llcyAlPiUgCiAgICBnZ3Bsb3QoYWVzKGVzcGVjaWVEZXNjLCBmciwgZmlsbCA9IGdydXBvKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChmciAqIDEwMCwgMSksICIlIikpLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gMC41LAogICAgICAgICAgICAgIGhqdXN0ID0gLTAuNSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxLjIpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X3dyYXAofm9yaWdlbSwgc2NhbGVzID0gImZyZWVfeSIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiSW5kaWNlIGRlIElkZW50aWZpY2HDp8OjbyBwb3IgT3JpZ2VtIiwKICAgICAgICAgZmlsbCA9ICJHcnVwb3MiLCB4ID0gIiIsIHkgPSAiXG5GcmVxdWVuY2lhIHJlbGF0aXZhIikgKwogICAgbXlfdGhlbWUKYGBgCgojIyMjIEluZGljZSBkZSBpZGVudGlmaWNhw6fDo28gcG9yIEVzcMOpY2llCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KcG9zX2dhYmFyaXRvJGVzcGVjaWVzICU+JSAKICAgIGdncGxvdChhZXMoZXNwZWNpZURlc2MsIGZyLCBmaWxsID0gb3JpZ2VtKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChmciAqIDEwMCwgMSksICIlIikpLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gMC41LAogICAgICAgICAgICAgIGhqdXN0ID0gLTAuMykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxLjIpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X3dyYXAofmdydXBvLCBzY2FsZXMgPSAiZnJlZV95IikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJJbmRpY2UgZGUgSWRlbnRpZmljYcOnw6NvIHBvciBFc3DDqWNpZSIsCiAgICAgICAgIGZpbGwgPSAiT3JpZ2VtIiwgeCA9ICIiLCB5ID0gIlxuRnJlcXVlbmNpYSByZWxhdGl2YSIpICsKICAgIG15X3RoZW1lCmBgYAoKIyMgVGVzdGVzIGRlIGhpcG90ZXNlcwoKRXNwZXJhZG8gcC12YWxvciA+PSAwLjA1IG5hIG5vcm1hbGlkYWRlIChlc3BlcmEtc2UgSDApCkVzcGVyYWRvIHAtdmFsb3IgPD0gMC4wNSBubyB0ZXN0ZSBkZSBoaXBvdGVzZSAoZXNwZXJhLXNlIEgxKQoKVGFiZWxhIGRvcyB0ZXN0ZXMgZGUgaGlwb3Rlc2VzIGFwbGljYWRvcwoKYGBge3J9CnQxIDwtIHQudGVzdCgKICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9leG90aWNhcywgCiAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfbmF0aXZhcywgCiAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAuOTUpCnQyIDwtIHQudGVzdCgKICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX2V4b3RpY2FzLCAKICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX25hdGl2YXMsIAogICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCBjb25mLmxldmVsID0gLjk1KQp0MyA8LSB0LnRlc3QoCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMsIAogICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgY29uZi5sZXZlbCA9IC45NSkKdDFiIDwtIHdpbGNveC50ZXN0KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9leG90aWNhcywgCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX25hdGl2YXMsIAogICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSkKdDJiIDwtIHdpbGNveC50ZXN0KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX2V4b3RpY2FzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9uYXRpdmFzLCAKICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUpCnQzYiA8LSB3aWxjb3gudGVzdCgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcywgCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcywgCiAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFKQpkYXRhLmZyYW1lKAogICAgIkNvbXBhcmHDp8OjbyIgPSBjKCJFeMOzdGljYXMgeCBOYXRpdmFzIiksCiAgICBBbGdvcml0bW8gPSBjKHQxJG1ldGhvZCwgdDIkbWV0aG9kLCB0MyRtZXRob2QsIHQxYiRtZXRob2QsIHQyYiRtZXRob2QsIHQzYiRtZXRob2QpLAogICAgIlZhcmnDoXZlbCIgPSBjKAogICAgICAgICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRhIG9yaWdlbSIsCiAgICAgICAgIkluZGljZSBkZSByZWNvbmhlY2ltZW50byIKICAgICksCiAgICBwX3ZhbG9yID0gYyh0MSRwLnZhbHVlLCB0MiRwLnZhbHVlLCB0MyRwLnZhbHVlLCAKICAgICAgICAgICAgICAgIHQxYiRwLnZhbHVlLCB0MmIkcC52YWx1ZSwgdDNiJHAudmFsdWUpLAogICAgSDAgPSBjKHQxJHAudmFsdWUgPj0gMC4wNSwgdDIkcC52YWx1ZSA+PSAwLjA1LCB0MyRwLnZhbHVlID49IDAuMDUsIAogICAgICAgICAgIHQxYiRwLnZhbHVlID49IDAuMDUsIHQyYiRwLnZhbHVlID49IDAuMDUsIHQzYiRwLnZhbHVlID49IDAuMDUpLAogICAgSDEgPSBjKHQxJHAudmFsdWUgPCAwLjA1LCB0MiRwLnZhbHVlIDwgMC4wNSwgdDMkcC52YWx1ZSA8IDAuMDUsCiAgICAgICAgICAgdDFiJHAudmFsdWUgPCAwLjA1LCB0MmIkcC52YWx1ZSA8IDAuMDUsIHQzYiRwLnZhbHVlIDwgMC4wNSksCiAgICAiQ29uZmlhbsOnYSIgPSBjKAogICAgICAgIHBhc3RlKHBhc3RlMChyb3VuZCh0MSRjb25mLmludCAqIDEwMCwgMiksICIlIiksIGNvbGxhcHNlID0gIiB+ICIpLAogICAgICAgIHBhc3RlKHBhc3RlMChyb3VuZCh0MiRjb25mLmludCAqIDEwMCwgMiksICIlIiksIGNvbGxhcHNlID0gIiB+ICIpLAogICAgICAgIHBhc3RlKHBhc3RlMChyb3VuZCh0MyRjb25mLmludCAqIDEwMCwgMiksICIlIiksIGNvbGxhcHNlID0gIiB+ICIpLAogICAgICAgICItIiwKICAgICAgICAiLSIsCiAgICAgICAgIi0iCiAgICApCikgJT4lCiAgbXV0YXRlKAogICAgcF92YWxvciA9IGNlbGxfc3BlYyhwX3ZhbG9yLCBib2xkID0gVCwgY29sb3IgPSAiYmxhY2siLCBhbGlnbiA9ICJyaWdodCIpLAogICAgSDAgPSBjZWxsX3NwZWMoSDAsIGJvbGQgPSBIMCwKICAgICAgICAgICAgICAgICAgIGNvbG9yPSBpZmVsc2UoSDAsICJ3aGl0ZSIsICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBpZmVsc2UoSDAsICJncmVlbiIsICIjQ0NDQ0NDIikpLAogICAgSDEgPSBjZWxsX3NwZWMoSDEsIGJvbGQgPSBIMSwgCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IGlmZWxzZShIMSwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMSwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICApICU+JQogIGthYmxlKGVzY2FwZSA9IEYpICU+JQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgY29sdW1uX3NwZWMoMiwgYm9sZCA9IFRSVUUpICU+JQogIGNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDE6MiwgdmFsaWduID0gInRvcCIpICU+JQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiSW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgOTUlIiwKICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuT2JzLjogIiwKICAgICAgICAgICBmb290bm90ZV9hc19jaHVuayA9IFQpCmBgYAoKCiMjIyAxIC0gT3MgYWx1bm9zIGl0ZW5kaWZpY2FtIG1haXMgb3Mgbm9tZXMgZG9zIGFuaW1haXMgZGUgZXNww6ljaWVzIGV4w7N0aWNhcyBxdWUgb3MgYW5pbWFpcyBkZSBlc3DDqWNpZXMgbmF0aXZhcy4KClJlc3VsdGFkbyBkbyB0ZXN0ZSBwYXJhbcOpdHJpY28KCmBgYHtyLCBlY2hvPUZBTFNFfQp0MQpgYGAKUmVzdWx0YWRvIGRvIHRlc3RlIG7Do28gcGFyYW3DqXRyaWNvCgpgYGB7ciwgZWNobz1GQUxTRX0KdDFiCmBgYAoKCiMjIyAyIC0gT3MgYWx1bm9zIGlkZW50aWZpY2FtIG1haXMgZXNww6ljaWVzIGRlIG9yaWdlbSBleMOzdGljYSBxdWUgYXMgZGUgb3JpZ2VtIG5hdGl2YS4KClJlc3VsdGFkbyBkbyB0ZXN0ZSBwYXJhbcOpdHJpY28KCmBgYHtyLCBlY2hvPUZBTFNFfQp0MgpgYGAKClJlc3VsdGFkbyBkbyB0ZXN0ZSBuw6NvIHBhcmFtw6l0cmljbwoKYGBge3IsIGVjaG89RkFMU0V9CnQyYgpgYGAKCiMjIyAzIC0gT3MgYWx1bm9zIGlkZW50aWZpY2FtIG1haXMgYXMgZXNww6ljaWVzIGV4w7N0aWNhcyAobm9tZSBkb3MgYW5pbWFpcyBlIG9yaWdlbSkgcXVlIGVzcMOpY2llcyBuYXRpdmFzLgoKUmVzdWx0YWRvIGRvIHRlc3RlIHBhcmFtw6l0cmljbwoKYGBge3IsIGVjaG89RkFMU0V9CnQzCmBgYAoKUmVzdWx0YWRvIGRvIHRlc3RlIG7Do28gcGFyYW3DqXRyaWNvCgpgYGB7ciwgZWNobz1GQUxTRX0KdDNiCmBgYAoKIyMjIDQgLSBPcyBhbHVub3MgcmVjb25oZWNlbSBtYWlzIG1hbcOtZmVyb3MgZG8gcXVlIG9zIGRlbWFpcyBncnVwb3MgdGF4b27Ds21pY29zLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNX0KcG9zX2dhYmFyaXRvJHRheG9ub21pY29zICU+JQogICAgZ2dwbG90KCkgKyAKICAgIGdlb21fYm94cGxvdChhZXMoeCA9IGdydXBvLCB5ID0gdmFsdWUsIGZpbGwgPSBvcmlnZW0pLCBzaG93LmxlZ2VuZCA9IFQpICsgCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlIGlkZW50aWZpY2HDp8OjbyBkZSBlc3DDqWNpZXMgcG9yIGdydXBvIHRheG9uw7RtaWNvIiwKICAgICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKYGBgCgpgYGB7cn0KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChwX2V4b3RpY2FfYXZlczpwX25hdGl2YV9yZXB0aWwpICU+JQogICAgbWVsdCgpCgp0bXAgPC0gY2JpbmQodG1wLCBjb2xzcGxpdCh0bXAkdmFyaWFibGUsICJfIiwgYygicCIsICJvcmlnZW0iLCAiZ3J1cG8iKSkpICU+JQogICAgc2VsZWN0KG9yaWdlbSwgZ3J1cG8sIHZhbHVlKQoKI3ByaW50KHRtcCkKYGBgCgpgYGB7cn0KYW5vdmEobG0odmFsdWUgfiBvcmlnZW0gKiBncnVwbywgdG1wKSkKVHVrZXlIU0QoYW92KGxtKHZhbHVlIH4gb3JpZ2VtICogZ3J1cG8sIHRtcCkpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD01fQojIHBlcm1hbm92YQojIGxpYnJhcnkodmVnYW4pCiMgYWRvbmlzKHZhbHVlIH4gb3JpZ2VtICogZ3J1cG8sIHRtcCwgcGVybXV0YXRpb25zPTk5KQpgYGAKCioqQWdydXBhZG8gcG9yIHR1cm1hcyoqCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NX0KIyBSZWFsaXphbmRvIEFub3ZhIGZhdG9yaWFsCmFub3ZhKGxtKHZhbHVlIH4gZ3J1cG8gKiBvcmlnZW0sIHBvc19nYWJhcml0byR0YXhvbm9taWNvcykpClR1a2V5SFNEKGFvdihsbSh2YWx1ZSB+IGdydXBvICogb3JpZ2VtLCBwb3NfZ2FiYXJpdG8kdGF4b25vbWljb3MpKSkKYGBgCgojIyMgNSAtIEVzdHVkYW50ZXMgcXVlIHJlc2lkZW0gbmEgQ2lkYWRlIDEgKGNvbSBVQykgaWRlbnRpZmljYW0gbWFpcyBlc3DDqWNpZXMgbmF0aXZhcyBkbyBxdWUgZXN0dWRhbnRlcyBxdWUgcmVzaWRlbSBuYSBDaWRhZGUgMiAoc2VtIFVDKS4KCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQp0bXAgPC0gcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvICU+JQogICAgc2VsZWN0KG11bmljaXBpbywgcF9ub21lX2V4b3RpY2FzOnBfaW5kaWNlX25hdGl2YXMpCnQudGVzdChwX2luZGljZV9uYXRpdmFzIH4gbXVuaWNpcGlvLCB0bXApCmBgYAoKIyMjIDYgLSBFc3R1ZGFudGVzIHF1ZSByZXNpZGVtIGVtIMOhcmVhIHJ1cmFsIHRlbSBtYWlvciBjb25oZWNpbWVudG8gc29icmUgYXMgZXNww6ljaWVzIG5hdGl2YXMuCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChhcmVhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykKdC50ZXN0KHBfaW5kaWNlX25hdGl2YXMgfiBhcmVhLCB0bXApCmBgYAoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNX0KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChhcmVhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykgJT4lCiAgICBtZWx0KCJhcmVhIikKdG1wIDwtCiAgICBjYmluZCh0bXAsIGNvbHNwbGl0KHRtcCR2YXJpYWJsZSwgIl8iLCBjKCJwIiwgImluZGljYWRvciIsICJvcmlnZW0iKSkpICU+JQogICAgc2VsZWN0KGFyZWEsIGluZGljYWRvciwgb3JpZ2VtLCB2YWx1ZSkKdG1wICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gYXJlYSwgeSA9IHZhbHVlLCBmaWxsID0gb3JpZ2VtKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIGZhY2V0X3dyYXAofmluZGljYWRvcikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBpZGVudGlmaWNhw6fDo28gZGUgZXNww6ljaWVzIE5hdGl2YXMgbm9zIGNyaXTDqXJpb3MgZXN0YWJlbGVjaWRvcyIsCiAgICAgICB5ID0gIlBlcmNlbnR1YWwgZGUgaWRlbnRpZmljYcOnw6NvIiwgeCA9ICIiKSArCiAgbXlfdGhlbWUKYGBgCgojIyMgNyAtIEZyZXF1ZW5jaWEgZGUgY29udGF0byBuYXR1cmV6YQoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNX0KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChmcmVxdWVuY2lhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykgJT4lCiAgICBtZWx0KGlkID0gImZyZXF1ZW5jaWEiKQoKdG1wIDwtCiAgICBjYmluZCh0bXAsIGNvbHNwbGl0KHRtcCR2YXJpYWJsZSwgIl8iLCBjKCJwIiwgImluZGljYWRvciIsICJvcmlnZW0iKSkpICU+JQogICAgc2VsZWN0KGZyZXF1ZW5jaWEsIGluZGljYWRvciwgb3JpZ2VtLCB2YWx1ZSkKCnRtcCAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IG9yaWdlbSwgeSA9IHZhbHVlLCBmaWxsID0gZnJlcXVlbmNpYSksIHNob3cubGVnZW5kID0gVCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBmYWNldF93cmFwKH5pbmRpY2Fkb3IpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGVzcMOpY2llcyBOYXRpdmFzIG5vcyBjcml0w6lyaW9zIGVzdGFiZWxlY2lkb3MiLAogICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogIG15X3RoZW1lCmBgYAoKYGBge3J9CmFub3ZhKGxtKHZhbHVlICB+IGZyZXF1ZW5jaWEsIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKSkKI1R1a2V5SFNEKGFvdihsbSh2YWx1ZSAgfiBmcmVxdWVuY2lhLCBkYXRhID0gdG1wICU+JSBmaWx0ZXIoaW5kaWNhZG9yID09ICJpbmRpY2UiKSkpKQpgYGAKCiMjIyA4IC0gRmV6IGF1bGFzIHByYXRpY2FzCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Mi41fQp0bXAgPC0gcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvICU+JQogICAgc2VsZWN0KGZlei5hdWxhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykgJT4lCiAgICBtZWx0KGlkID0gImZlei5hdWxhIikKCnRtcCA8LQogICAgY2JpbmQodG1wLCBjb2xzcGxpdCh0bXAkdmFyaWFibGUsICJfIiwgYygicCIsICJpbmRpY2Fkb3IiLCAib3JpZ2VtIikpKSAlPiUKICAgIHNlbGVjdChmZXouYXVsYSwgaW5kaWNhZG9yLCBvcmlnZW0sIHZhbHVlKQoKdG1wICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gb3JpZ2VtLCB5ID0gdmFsdWUsIGZpbGwgPSBmZXouYXVsYSksIHNob3cubGVnZW5kID0gVCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBmYWNldF93cmFwKH5pbmRpY2Fkb3IpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGVzcMOpY2llcyBOYXRpdmFzIG5vcyBjcml0w6lyaW9zIGVzdGFiZWxlY2lkb3MiLAogICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogIG15X3RoZW1lCmBgYAoKYGBge3J9CmFub3ZhKGxtKHZhbHVlICB+IGZlei5hdWxhLCBkYXRhID0gdG1wICU+JSBmaWx0ZXIoaW5kaWNhZG9yID09ICJpbmRpY2UiKSkpCiNUdWtleUhTRChhb3YobG0odmFsdWUgIH4gZnJlcXVlbmNpYSwgZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGluZGljYWRvciA9PSAiaW5kaWNlIikpKSkKYGBgCgojIyMgOSAtIEVzdHVkYW50ZXMgZGUgU2lsdmFuaWEgcXVlIHZpc2l0YW0gYSBVQyB0ZW0gbWFpb3IgcHJvcG9yw6fDo28gZGUgYWNlcnRvcyBlc3DDqWNpZXMgbmF0aXZhcy4KCmBgYHtyfQp0bXAgPC0gCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBmaWx0ZXIobXVuaWNpcGlvID09ICJTaWx2w6JuaWEiKSAlPiUKICAgIHNlbGVjdChmbG9uYSwgcF9pbmRpY2VfbmF0aXZhcykKI25vcm1hbGlkYWRlKHRtcCRwX2luZGljZV9uYXRpdmFzKQp0LnRlc3QocF9pbmRpY2VfbmF0aXZhcyB+IGZsb25hLCB0bXApCmBgYAoKIyMjIDEwIC0gUmFua2luZyBkb3MgYW5pbWFpcwoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9CmExIDwtIAogICAgcG9zX2dhYmFyaXRvJHJha2luZ19hbmltYWlzJG5hdGl2b3MgJT4lCiAgICBoZWFkKDIwKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFuaW1haXMsIHkgPSBmcmVxLCBmaWxsID0gZnJlcSkpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMSwgaGp1c3QgPSAwLjUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsOTApKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJvcmFuZ2UiLCBoaWdoID0gInJlZCIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJFc3DDqWNpZXMgY2l0YWRhcyBjb21vIG5hdGl2YXMiLAogICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICIiKSArCiAgICBteV90aGVtZQphMiA8LSAKICAgIHBvc19nYWJhcml0byRyYWtpbmdfYW5pbWFpcyRleG90aWNvcyAlPiUKICAgIGhlYWQoMjApICU+JQogICAgZ2dwbG90KGFlcyh4ID0gYW5pbWFpcywgeSA9IGZyZXEsIGZpbGwgPSBmcmVxKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBmcmVxKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB2anVzdCA9IC0xLCBoanVzdCA9IDAuNSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw5MCkpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImxpZ2h0Ymx1ZSIsIGhpZ2ggPSAiZGFya2JsdWUiKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiRXNww6ljaWVzIGNpdGFkYXMgY29tbyBleMOzdGljYXMiLAogICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICIiKSArCiAgICBteV90aGVtZQoKZ3JpZC5hcnJhbmdlKGExLCBhMiwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIlRPUCAyMCAtIFJhbmtpbmcgZGFzIGVzcMOpY2llcyBjaXRhZGFzIGNvbW8gZXhlbXBsb1xuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKQopCmBgYAoKIyMjIDExIC0gUmFua2luZyBkb3MgYW5pbWFpcyBjaXRhZG9zIHBhcmEgcHJvdGXDp8OjbwoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTJ9CmEzIDwtIAogICAgcG9zX2dhYmFyaXRvJHJha2luZ19hbmltYWlzJHByb3RlZ2lkb3MgJT4lCiAgICBoZWFkKDIwKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFuaW1haXMsIHkgPSBmcmVxLCBmaWxsID0gZnJlcSkpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMSwgaGp1c3QgPSAwLjUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTkwKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JlZW4iLCBoaWdoID0gImRhcmtncmVlbiIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJFc3DDqWNpZXMgY2l0YWRhcyBjb21vIG5hdGl2YXMiLAogICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICIiKSArCiAgICBteV90aGVtZQoKZ3JpZC5hcnJhbmdlKGEzLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIlRPUCAyMCAtIFJhbmtpbmcgZGFzIGVzcMOpY2llcyBjaXRhZGFzIGNvbW8gZXhlbXBsbyBwYXJhIHByb3Rlw6fDo29cbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0yfQojIG5vcm1hbGlkYWRlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRub3RhKQojIGJhcnBsb3QodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJG5vdGEpKQojIGhpc3QocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJG5vdGEpCiMgaGlzdChsb2cocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJG5vdGEpKQoKCiMjIEFub3ZhIHBvciBncnVwbyBkZSBlc3DDqWNpZXMKCiMgZm9yKGdycCBpbiB1bmlxdWUocG9zX2dhYmFyaXRvJGVzcGVjaWUkZ3J1cG8pKSB7CiMgICAgIG1lc3NhZ2UoZ3JwKQojICAgICAKIyAgICAgVHVrZXlIU0QoYW92KGxtKGFjZXJ0b3MgfiBlc3BlY2llICsgZ3J1cG8sIHRibF9lc3BlY2llczEpKSkKIyAgICAgZGFkb3MgPC0gCiMgICAgICAgICBwb3NfZ2FiYXJpdG8kZXNwZWNpZXNCcnV0byAlPiUgCiMgICAgICAgICBmaWx0ZXIoZ3J1cG8gPT0gZ3JwKSAlPiUgCiMgICAgICAgICBtdXRhdGUodmFsdWUgPSBmciwgZXNwZWNpZSA9IGZhY3Rvcihlc3BlY2llKSkKIyAgICAgI3ByaW50KGRhZG9zKQojICAgICAjYWdncmVnYXRlKHZhbHVlIH4gZ3J1cG8sIGRhZG9zLCAgRlVOID0gZnVuY3Rpb24oeCkgc2hhcGlyby50ZXN0KHgpJHAudmFsdWUpCiMgICAgIAojICAgICBzaGFwaXJvLnRlc3QoZGFkb3MkZnIpCiMgICAgIGFub3ZhKGxtKGZyIH4gZXNwZWNpZSwgZGFkb3MpKQojICAgICBUdWtleUhTRChhb3YobG0oZnIgfiBlc3BlY2llLCBkYWRvcykpKQojIH0KYGBgCgo=